//package com.njupt.Sort;
//
//
//import org.junit.jupiter.api.Test;
//import org.springframework.aop.framework.AopProxyUtils;
//import org.springframework.context.support.ClassPathXmlApplicationContext;
//
//import java.util.Arrays;
//
///**
// * @Author: wujiaming
// * @CreateTime: 2024/11/15 16:57
// * @Description: 排序结果测试
// * @Version: 1.0
// */
//
//
//public class TestSortResult {
//
//    @Test
//    public void test(){
//        ClassPathXmlApplicationContext context
//                = new ClassPathXmlApplicationContext("applicationContext.xml");
//
//
//        /**
//         * 1、注意spring会为MergeSort类创建代理对象，将代理对象注册到容器中，MergeSort不在容器中
//         * 2、代理对象看起来想目标类，但他是目标类的子类（对于CGLIB代理）或者接口实现类（对于JDK动态代理）
//         *      2.1当启动AOP时
//         *          ①spring检测到MergeSort是需要被代理的类
//         *          ②spring使用AOP创建了MergeSort的代理对象
//         *          ③此时pring容器中注册的是代理对象，而不是MergeSort原始实例
//         *       2.2使用接口代理的情况下
//         *          ①如果MergeSort实现了Sort接口，spring会默认使用JDK动态代理，生成实现接口的代理都对象
//         *          ②如果MergeSort没有实现接口，spring会使用CGLIB动态代理，生成了一个继承MergeSort的代理对象
//         * 3、思考：为什么原始类不存在IOC容器中
//         *      原因：springAOP设计的原则是：强调的逻辑是代理对象的那部分，所有目标对象的方法都应该通过代理对象进行。
//         *            如果spring容器中同时存在原始类和代理类对象，会导致调用路径不一致（绕过代理）
//         * 4、那么如何获得原始类的实例？
//         *      spring提供了AopProxyUtils从代理对象中获取原始目标对象
//         *
//         */
//
//        //第一种情况：MergeSort类并没有实现Sort接口，此时spring采用的是CGLIB动态代理，代理类是继承MergeSort的子类
//        //既然代理类是目标类的子类，那么子类（代理类）就会继承目标类所有的属性和方法
////        MergeSort bean1 = context.getBean(MergeSort.class);
////
////        bean1.sort(bean1.getNums(),0,bean1.getNums().length-1);
////        System.out.println(Arrays.toString(bean1.getNums()));
//
//
//        //第二种情况（也是spring默认的情况采用JDK动态代理，目标类实现了一个接口）：
//        //此时只能通过接口的方式创建代理类
//        //此时有两种方法获取目标类的实例/实例中的方法
//        //1、接口中增加相应的get方法，或者对应的方法
//        Sort bean = context.getBean(Sort.class);
//        Integer[] nums = bean.getNums();
//        bean.sort(nums,0 ,nums.length-1 );
//        System.out.println(Arrays.toString(bean.getNums()));
//
//        System.out.println();
//
//        //2、AopProxyUtils从代理对象中获取原始目标对象
//        MergeSort mergeSort = (MergeSort) AopProxyUtils.getSingletonTarget(bean);
//        bean.sort(mergeSort.getNums(),0 ,mergeSort.getNums().length-1 );
//        System.out.println(Arrays.toString(bean.getNums()));
//    }
//}
